package com.ylyq.ylxx;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.util.TextUtils;
import org.junit.Test;
import org.mp4parser.Container;
import org.mp4parser.muxer.Movie;
import org.mp4parser.muxer.Track;
import org.mp4parser.muxer.builder.DefaultMp4Builder;
import org.mp4parser.muxer.container.mp4.MovieCreator;
import org.mp4parser.muxer.tracks.AppendTrack;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * 如果你要使用上面代码，留意修改上面TODO部分即可，修改后，run main()方法，文件会生成在指定目录，比如下面的数据库表
 */
@Slf4j
public class MysqlGeneratorUtil {

    private static final String url = "jdbc:mysql://192.168.100.119:3306/company?serverTimezone=GMT&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false&useSSL=true";
    private static final String username = "gyy";
    private static final String password = "123456";
    private static final String dirverName = "com.mysql.cj.jdbc.Driver";

    //要生成的表名
    public static String[] genTablesName = new String[]{
//            "ylyq_user",
            "ylyq_cover_elements"
    };
    //要生成的表名
    public static String[] superColumns = new String[]{
            "id", "createdBy", "createdTime", "updatedBy", "updatedTime", "remark", "delFlag"
    };

    /**
     * RUN THIS
     */
    @Test
    public static void main(String[] args) {


//        Calendar a = Calendar.getInstance();
//        a.add(Calendar.DAY_OF_MONTH, -30);
//        String startDate = new SimpleDateFormat("YYYY-MM-dd").format(a.getTime());
//        Calendar c = Calendar.getInstance();
////        c.add(Calendar.DAY_OF_MONTH, -1);
//        String endDate = new SimpleDateFormat("YYYY-MM-dd").format(c.getTime());
//        System.out.println(startDate+"\n"+endDate+"\n"+Tools.getDayPactice(endDate));


//        IPage<YlyqUser> page = new Page<>(1, 20);
//        IPage<YlyqUser> pageResult = sysUserService.page(page, null);
//        return new ResponseData(ResponseData.Result.SUCCESS,pageResult);不要使用这种方式，这样会反复查

//        List<YlyqUser> records = sysUserService.page(page).getRecords();
//        List<YlyqUser> records = sysUserService.page(new Page<>(1, 20)).getRecords();
//        return new ResponseData(ResponseData.Result.SUCCESS, records);
//        return new ResponseData(ResponseData.Result.SUCCESS, sysUserService.page(new Page<>(1, 20),null));

//
//        int day = Tools.getDayFromdateToEndDate("2020-08-06", "2020-08-06");
//        String startDate = Tools.getDatelaterDay("2020-08-06", day + 1);
//        String endDate = Tools.getDatelaterDay("2020-08-06", day + 1);
//        System.out.println(day + "\n" + startDate + "\n" + endDate);



        //视频拼接合并
        try {

//            List<String> videos=new ArrayList<>();
//            videos.add("C:\\uploads\\temp\\mmm.mp4");
//            videos.add("C:\\uploads\\temp\\mmm2.mp4");
////            videos.add("C:\\uploads\\temp\\abc.mp4");
////            videos.add("C:\\uploads\\temp\\abcd.mp4");
////            videos.add("C:\\uploads\\temp\\20200803134725下载.mp4");
////            videos.add("C:\\uploads\\temp\\20200810172752视频播放器.mp4");
//            File file=new File("C:\\uploads\\target\\mmm1.mp4");
//            if (!file.getParentFile().exists()) {
//                if (!file.getParentFile().mkdirs()) {
//                    log.info(
//                            "- ERROR creating output directory '" + file.getParentFile().getAbsolutePath() + "'");
//                }
//            }
//            if (!file.exists()) {
//                file.createNewFile();
//            }
//            Mp4ParserUtils.mergeVideo(videos,file);
//            System.out.println("合并完成！");


//            List<String> videos=new ArrayList<>();
//            videos.add("C:\\uploads\\temp\\mmm.mp4");
//            videos.add("C:\\uploads\\temp\\mmm2.mp4");
////            File file=new File("C:\\uploads\\target\\123.mp4");
//            joinVideo(videos,"C:\\uploads\\target\\mmm3.mp4");
        } catch (Exception e) {

            e.printStackTrace();
        }


        runMybatisPlusGenerator();

    }

    public static boolean joinVideo(List<String> filePaths, String resultPath) {
        boolean result = false;

        if (filePaths == null || filePaths.size() <= 0 || TextUtils.isEmpty(resultPath)) {
            throw new IllegalArgumentException();
        }
        if (filePaths.size() == 1) { // 只有一个视频片段，不需要合并
            return true;
        }

        try {
            Movie[] inMovies = new Movie[filePaths.size()];
            for (int i = 0; i < filePaths.size(); i++) {
                File f = new File(filePaths.get(i));
                if (f.exists()) {
                    inMovies[i] = MovieCreator.build(filePaths.get(i));
                }
            }

            // 分别取出音轨和视频
            List<Track> videoTracks = new LinkedList<>();
            List<Track> audioTracks = new LinkedList<>();
            for (Movie m : inMovies) {
                for (Track t : m.getTracks()) {
                    if (t.getHandler().equals("soun")) {
                        audioTracks.add(t);
                    }
                    if (t.getHandler().equals("vide")) {
                        videoTracks.add(t);
                    }
                }
            }

            // 合并到最终的视频文件
            Movie outMovie = new Movie();

            if (audioTracks.size() > 0) {
                outMovie.addTrack(new AppendTrack(audioTracks.toArray(new Track[audioTracks.size()])));
            }
            if (videoTracks.size() > 0) {
                outMovie.addTrack(new AppendTrack(videoTracks.toArray(new Track[videoTracks.size()])));
            }

            Container mp4file = new DefaultMp4Builder().build(outMovie);

            // 将文件输出
            File resultFile = new File(resultPath);
            if (resultFile.exists() && resultFile.isFile()) {
                resultFile.delete();
            }
            FileChannel fc = new RandomAccessFile(resultFile, "rw").getChannel();
            mp4file.writeContainer(fc);
            fc.close();

            // 合成完成后把原片段文件删除
            for (String filePath : filePaths) {
                File file = new File(filePath);
                file.delete();
            }
            result = true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }


    private static void runMybatisPlusGenerator() {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/ylyq/src/main/java");
        // TODO 设置用户名
        gc.setAuthor("xiaweichao");
        gc.setOpen(true);
        // service 命名方式
        gc.setServiceName("I%sService");
        // service impl 命名方式
        gc.setServiceImplName("%sServiceImpl");
        // 自定义文件命名，注意 %s 会自动填充表实体属性！
        gc.setMapperName("%sMapper");
        gc.setXmlName("%sMapper");
        gc.setFileOverride(true);
//        gc.setActiveRecord(true);
        gc.setActiveRecord(false);
        // XML 二级缓存
        gc.setEnableCache(false);
        // XML ResultMap
        gc.setBaseResultMap(true);
        // XML columList
//        gc.setBaseColumnList(false);
        gc.setBaseColumnList(true);
        gc.setSwagger2(true); //实体属性 Swagger2 注解
        mpg.setGlobalConfig(gc);

        // TODO 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setDbType(DbType.MYSQL);
        dsc.setUrl(url);
        dsc.setDriverName(dirverName);
        dsc.setUsername(username);
        dsc.setPassword(password);
        mpg.setDataSource(dsc);

        // TODO 包配置
        PackageConfig pc = new PackageConfig();
        //pc.setModuleName(scanner("模块名"));
        pc.setParent("com.ylyq.ylxx");
        pc.setController("controller");
        pc.setEntity("entity");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        mpg.setPackageInfo(pc);

        // 自定义需要填充的字段
        List<TableFill> tableFillList = new ArrayList<>();
        //如 每张表都有一个创建时间、修改时间
        //而且这基本上就是通用的了，新增时，创建时间和修改时间同时修改
        //修改时，修改时间会修改，
        //虽然像Mysql数据库有自动更新几只，但像ORACLE的数据库就没有了，
        //使用公共字段填充功能，就可以实现，自动按场景更新了。
        //如下是配置
        //TableFill createField = new TableFill("gmt_create", FieldFill.INSERT);
        //TableFill modifiedField = new TableFill("gmt_modified", FieldFill.INSERT_UPDATE);
        //tableFillList.add(createField);
        //tableFillList.add(modifiedField);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };
        List<FileOutConfig> focList = new ArrayList<>();
        focList.add(new FileOutConfig("/templates/mapper.xml.ftl") {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                return projectPath + "/ylyq/src/main/resources/mapper/"
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);
        mpg.setTemplate(new TemplateConfig().setXml(null));

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        // 字段名生成策略
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setEntityLombokModel(true);
        // 设置逻辑删除键
        strategy.setLogicDeleteFieldName("del_flag");
        // TODO 指定生成的bean的数据库表名
        strategy.setInclude(genTablesName);
        strategy.setSuperEntityColumns(superColumns);
        strategy.setRestControllerStyle(true);
        strategy.setEntityTableFieldAnnotationEnable(true);
        // 驼峰转连字符
        strategy.setControllerMappingHyphenStyle(true);

        // 自定义实体父类
        strategy.setSuperEntityClass("com.ylyq.ylxx.entity.BaseEntity");
        // 自定义实体,公共字段
        // strategy.setSuperEntityColumns(new String[] { "test_id", "age" });
        // 自定义 mapper 父类
        // strategy.setSuperMapperClass("com.maxbill.base.SuperMapper");
        // 自定义 service 父类
        // strategy.setSuperServiceClass("com.maxbill.base.SuperService");
        // 自定义 service 实现类父类
        // strategy.setSuperServiceImplClass("com.maxbill.base.SuperServiceImpl");
        // 自定义 controller 父类
        // strategy.setSuperControllerClass("com.maxbill.base.SuperController");
        // 【实体】是否生成字段常量(默认 false)
        // public static final String ID = "test_id";
//        strategy.setEntityColumnConstant(false);
        // 【实体】是否为构建者模型(默认 false)
        // public User setName(String name) {this.name = name; return this;}
//        strategy.setEntityBuilderModel(true);

        mpg.setStrategy(strategy);
        // 选择 freemarker 引擎需要指定如下加，注意 pom 依赖必须有！
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }


}

